/**
 * Classe qui gère le fichiers de configuration, de contacts et du dictionnaire personnel
 * @author Marie-Hélène Goddet, Damien Finck, Cédric Schaller
 * 
 */
package fastwriting;

import java.awt.Color;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Hashtable;
import java.util.Scanner;

import utils.OperationsDates;

public class Config {
	
	public final static String DOSSIER_DATA = "./data/";
	public final static String FICHIER_CONFIG = "./data/config.ini";
	public final static String FICHIER_CONTACTS = "./data/contacts.csv";
	public final static String FICHIER_DICO_PERSO = "./data/perso.txt";
	
	/**
	 * Vérifie si le fichiers de config, de contacts et de dictionnaire perso existent
	 * Les créent et les préremplissent si ce n'est pas le cas.
	 */
	public static void checkData() {
		File data = new File(DOSSIER_DATA);
		if (!data.exists())
			data.mkdir();
		
		File config = new File(FICHIER_CONFIG);
		if (!config.exists()) {
			try {
				config.createNewFile();
				createConfig();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		
		File contacts = new File(FICHIER_CONTACTS);
		if (!contacts.exists()) {
			try {
				contacts.createNewFile();
				createContatcts();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		File dico_perso = new File(FICHIER_DICO_PERSO);
		if (!dico_perso.exists()) {
			try {
				dico_perso.createNewFile();
				createDicoPerso();
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
	}
	
	/**
	 * Lis le fichier de configuration.
	 */
	public static void lireConfig() { 
		checkData();
		
		File f = new File(FICHIER_CONFIG);
		FastWriting.config = new Hashtable<String,Hashtable<String,String>>();
		Scanner sc;
		String noeud = null;
		String key,value;
		try {
			sc = new Scanner(f);
			while(sc.hasNextLine()) {
				String l=sc.nextLine();
				if (l.length()>0 && l.charAt(0)!=';' && l.charAt(0)!=' ') {
					if (l.charAt(0)=='[') {
						noeud=l.substring(1,l.indexOf(']'));
						FastWriting.config.put(noeud,new Hashtable<String,String>());
					} else {
						key=l.substring(0,l.indexOf("="));
						value=l.substring(l.indexOf("=")+1);
						FastWriting.config.get(noeud).put(key,value);
					}
				}
			}
			sc.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Sauvegarde les modifications de configurations dans le fichier
	 * @param isCreation true si on crée la config
	 */
	public static void saveConfig(boolean isCreation) { 
		
		String nom, mail, langue, trait_taille, trait_couleur, theme;
		String date, os_name, os_version;
		if (isCreation) {
			nom="Mon_nom";
			mail="Mon_adresse_mail";
			langue="FR";
			trait_taille="moyen";
			trait_couleur="CouleurTrait=java.awt.Color[r=255,g=0,b=0]";
			theme="0";
			
			Date today = new Date();
			date = OperationsDates.toString(today);
			os_name = System.getProperty("os.name", "");
			os_version = System.getProperty("os.version", "");
			
		} else {
			nom=FastWriting.config.get("Utilisateur").get("Nom").toString();
			mail=FastWriting.config.get("Utilisateur").get("Mail").toString();
			langue=FastWriting.config.get("Dico").get("Langue").toString();
			trait_taille=FastWriting.config.get("Personnalisation").get("TailleTrait").toString();
			trait_couleur=FastWriting.config.get("Personnalisation").get("CouleurTrait").toString();
			theme=FastWriting.config.get("Themes").get("Theme").toString();
			
			date=FastWriting.config.get("Configuration").get("DateCreationCetteConfig").toString();
			os_name=FastWriting.config.get("Configuration").get("NomOS").toString();
			os_version=FastWriting.config.get("Configuration").get("VersionOS").toString();
		}
		
		PrintWriter fout;
		try {
			fout = new PrintWriter(new FileWriter(FICHIER_CONFIG,false));
			fout.println(";------------------------------------------------------------------------------");
			fout.println(";      Config.ini      --   FastWriting (c) 2010                               ");
			fout.println(";------------------------------------------------------------------------------");
			fout.println();
			fout.println(";NE MODIFIEZ CE FICHIER QUE SI VOUS SAVEZ CE QUE VOUS FAITES !!");
			fout.println(";   *** Information *** : true=VRAI ; false=FAUX               ");
			fout.println();
			fout.println(";Paramètres du l'utilisateur");
			fout.println("[Utilisateur]");
			fout.println("Nom="+nom);
			fout.println("Mail="+mail);
			fout.println();
			fout.println(";Langue du dictionnaire");
			fout.println("[Dico]");
			fout.println("Langue="+langue);
			fout.println();
			fout.println(";Personnalisation");
			fout.println("[Personnalisation]");
			fout.println("TailleTrait="+trait_taille);
			fout.println("CouleurTrait="+trait_couleur);
			fout.println();
			fout.println(";Thèmes (0=Thème système)");
			fout.println("[Themes]");
			fout.println("Theme="+theme);
			fout.println();
			fout.println("; ***** NE PAS TOUCHER EN-DESSOUS DE CETTE LIGNE *****");
			fout.println(";               (auto-generate bloc)                  ");
			fout.println("[Configuration]");
			fout.println("DateCreationCetteConfig="+date);
			fout.println("NomOS="+os_name);
			fout.println("VersionOS="+os_version);
			fout.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		lireConfig();
	}
	
	/**
	 * Transforme une couleur enregistré avec r=x,g=x,b=x en objet Color 
	 * @param s la couleur indiquée de la manière : "java.awt.Color[r=255,g=0,b=0]"
	 * @return un objet Color représentant la même couleur
	 */
	public static Color stringToColor(String s) {
		Color c;
		int r=0,v=0,b=0;
		int t1,t2;
		t1=s.lastIndexOf("r=");
		t2=s.lastIndexOf(",g=");
		r=Integer.parseInt(s.substring(t1+2,t2));
		t1=s.lastIndexOf("g=");
		t2=s.lastIndexOf(",b=");
		v=Integer.parseInt(s.substring(t1+2,t2));
		t1=s.lastIndexOf("b=");
		t2=s.lastIndexOf("]");
		b=Integer.parseInt(s.substring(t1+2,t2));
		c = new Color(r,v,b);
		return c;
	}
	
	/**
	 * Crée la configuration 
	 */
	public static void createConfig() {
		saveConfig(true);
	}
	
	/**
	 * Crée les contacts
	 */
	public static void createContatcts() {
		PrintWriter fout;
		try {
			fout = new PrintWriter(new FileWriter(FICHIER_CONTACTS,false));
			fout.println("id;nom;prenom;tel;mail");
			fout.println("1;FastWriting;;06xxxxxxxx;fastwriting@gmail.com");
			fout.println("1;Exemple;Exemple;06xxxxxxxx;exemple.exemple@exemple.fr");
			fout.println("2;Exemple;Exemple;06xxxxxxxx;exemple.exemple@exemple.fr");
			fout.println("3;Exemple;Exemple;06xxxxxxxx;exemple.exemple@exemple.fr");
			fout.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Crée le dictionnaire personnel
	 */
	public static void createDicoPerso() {
		PrintWriter fout;
		try {
			fout = new PrintWriter(new FileWriter(FICHIER_DICO_PERSO,false));
			fout.println();
			fout.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
